package cn.bugstack.domain.receiveRaffleCount.service.active;

import cn.bugstack.domain.receiveRaffleCount.service.IReceiveRaffleCount;

/**
 * TODO
 *
 * @Description
 * @Author Lx
 * @Date 2024/8/6 21:39
 **/
public class ReceiveRaffleCount implements IReceiveRaffleCount {

    //签到领取次数
    @Override
    public boolean receiveRaffleCount(String uId, String activityId) {
        //1.拿到active的具体信息

        //2.拿出他这次可以领取什么东西


        //3.令牌大闸防止单机刷领取次数(可以控制单机刷票，可以控制运营成本，指定每天只能够领取这么多次数的次数，即领奖池，每日有限)，并且在这里面setnx
        //3.1.令牌大闸，判断是否还有次数，先去抢令牌，这个令牌不需要精确控制到数据库，只需要缓存就可以了，属于是缓存上的一层缓存，不需要做同步更新
        //如果拿不到令牌，则不做下面的操作了,说明可接受的成本上限了

        //3.2.setnx保证不是单机刷票。由于redis可能会崩溃，所以我们要做个兜底的措施，一般是用集群了。->用了集群后恢复的时候可能会有从节点写数据的数据不一致的问题，
        //所以我们尽量不要去写，要先去主节点中去读，因为主节点只有一个，不会有数据不一致的问题。

        //4.setnx成功后，缓存预热

        //5.setnx成功后，再异步MQ更新数据库。由于MQ的消息可可能会丢失，所以我们需要做个兜底的措施，->一般不用集群，我们要采用一种反馈的机制或者是一种重传的机制,我们直接写到缓存当中就好，在当中做一个taskJob的记录
        //为了提高MQ的效率，这里我们可以采用线程池来提高单机的MQ的效率，在listen那用线程池，定时任务+线程池

        //6.即使MQ过去之后，那边执行更新数据库时，也可能会导致更新数据库失败(连接数过多的时候)，所以我们还会有一张taskJob的表,事务般的更新数据库和taskJob表




        return false;
    }
}
